/*
 * JDBCListaDAO.java
 *
 * Created on July 24, 2007, 2:08 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package br.usp.poli.mfc.struts.DAO.JDBC;

import br.usp.poli.mfc.struts.DAO.ListaDAO;
import br.usp.poli.mfc.struts.bean.Lista;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

/**
 *
 * @author William T.
 */
public class JDBCListaDAO implements ListaDAO{
    
    /** Creates a new instance of JDBCListaDAO */
    public JDBCListaDAO() {
    }
    
    public Lista getListaByRevistaUsuario(Integer IDRevista, Integer IDUsuario) {
        Connection conn;
        PreparedStatement ps;
        CallableStatement cs;
        ResultSet rs;
        Lista ret = null;
        if(IDRevista < 0 || IDUsuario < 0) return null;
        /* O resto do codigo vai aqui */
        try {
            conn = JDBCUtil.getConnection();
            String query = "select * from \"ADMIN\".\"LISTA\" where IDREVISTA = " + IDRevista + " and IDUSUARIO = " + IDUsuario;
            ps = conn.prepareStatement(query);
            rs = ps.executeQuery();
            rs.next();
            ret = new Lista();
            ret.setIDUsuario(rs.getInt("IDUSUARIO"));
            ret.setIDRevista(rs.getInt("IDREVISTA"));
            if(rs.getDate("DT_ENTREGA") != null) ret.setDt_Entrega(new Date(rs.getDate("DT_ENTREGA").getTime()));
            if(rs.getDate("DT_RECEBIMENTO") != null) ret.setDt_Recebimento(new Date(rs.getDate("DT_RECEBIMENTO").getTime()));
            ret.setPrioridade(rs.getInt("PRIORIDADE"));
            conn.close();
        } catch (SQLException e) {
            System.out.println("***SQL EXCEPTION @ getListaByRevista***");
            e.printStackTrace();
        }
        return ret;
    }
    
    /*
     *@return: ArrayList de listas por revista
     */
    public ArrayList<Lista> getListaByRevista(Integer IDRevista) {
        Connection conn;
        PreparedStatement ps;
        CallableStatement cs;
        ResultSet rs;
        ArrayList<Lista> ret = null;
        if(IDRevista < 0) return null;
        /* O resto do codigo vai aqui */
        try {
            conn = JDBCUtil.getConnection();
            String query = "select * from \"ADMIN\".\"LISTA\" where IDREVISTA = " + IDRevista;
            ps = conn.prepareStatement(query);
            rs = ps.executeQuery();
            while(rs.next()) {
                if(ret == null) ret = new ArrayList<Lista>();
                Lista l = new Lista();
                l.setIDUsuario(rs.getInt("IDUSUARIO"));
                l.setIDRevista(rs.getInt("IDREVISTA"));
                if(rs.getDate("DT_ENTREGA") != null) l.setDt_Entrega(new Date(rs.getDate("DT_ENTREGA").getTime()));
                if(rs.getDate("DT_RECEBIMENTO") != null) l.setDt_Recebimento(new Date(rs.getDate("DT_RECEBIMENTO").getTime()));
                l.setPrioridade(rs.getInt("PRIORIDADE"));
                ret.add(l);
            }
            conn.close();
        } catch (SQLException e) {
            System.out.println("***SQL EXCEPTION @ getListaByRevista***");
            e.printStackTrace();
        }
        return ret;
    }
    
    public ArrayList<Lista> getListaPendenteByRevista(Integer IDRevista) {
        Connection conn;
        PreparedStatement ps;
        CallableStatement cs;
        ResultSet rs;
        ArrayList<Lista> ret = null;
        if(IDRevista < 0) return null;
        /* O resto do codigo vai aqui */
        try {
            conn = JDBCUtil.getConnection();
            String query = "select * from lista where (DT_RECEBIMENTO is null or DT_ENTREGA is null) and idrevista = " + IDRevista + "order by PRIORIDADE desc";
            ps = conn.prepareStatement(query);
            rs = ps.executeQuery();
            while(rs.next()) {
                if(ret == null) ret = new ArrayList<Lista>();
                Lista l = new Lista();
                l.setIDUsuario(rs.getInt("IDUSUARIO"));
                l.setIDRevista(rs.getInt("IDREVISTA"));
                if(rs.getDate("DT_ENTREGA") != null) l.setDt_Entrega(new Date(rs.getDate("DT_ENTREGA").getTime()));
                if(rs.getDate("DT_RECEBIMENTO") != null) l.setDt_Recebimento(new Date(rs.getDate("DT_RECEBIMENTO").getTime()));
                l.setPrioridade(rs.getInt("PRIORIDADE"));
                ret.add(l);
            }
            conn.close();
        } catch (SQLException e) {
            System.out.println("***SQL EXCEPTION @ getListaPendenteByRevista***");
            e.printStackTrace();
        }
        return ret;
    }
    
    public boolean deleteLista(Integer IDUsuario, Integer IDRevista) {
        Connection conn;
        PreparedStatement ps;
        CallableStatement cs;
        ResultSet rs;
        if(IDUsuario < 0 || IDRevista < 0) return false;
        try {
            conn = JDBCUtil.getConnection();
            String query = "delete from lista where idrevista = " + IDRevista + " and idusuario = " + IDUsuario;
            ps = conn.prepareStatement(query);
            return !ps.execute();
        } catch (SQLException e) {
            System.out.println("***SQL EXCEPTION @ getListaByRevista***");
            e.printStackTrace();
        }
        return false;
    }
    
    public ArrayList<Lista> getListaByUsuario(Integer IDUsuario) {
        Connection conn;
        PreparedStatement ps;
        CallableStatement cs;
        ResultSet rs;
        ArrayList<Lista> ret = null;
        if(IDUsuario < 0) return null;
        /* O resto do codigo vai aqui */
        try {
            conn = JDBCUtil.getConnection();
            String query = "select * from \"ADMIN\".\"LISTA\" where idusuario = " + IDUsuario;
            ps = conn.prepareCall(query);
            rs = ps.executeQuery();
            while(rs.next()) {
                if(ret == null) ret = new ArrayList<Lista>();
                Lista l = new Lista();
                l.setIDUsuario(rs.getInt("IDUSUARIO"));
                l.setIDRevista(rs.getInt("IDREVISTA"));
                if(rs.getDate("DT_ENTREGA") != null) l.setDt_Entrega(new Date(rs.getDate("DT_ENTREGA").getTime()));
                if(rs.getDate("DT_RECEBIMENTO") != null) l.setDt_Recebimento(new Date(rs.getDate("DT_RECEBIMENTO").getTime()));
                l.setPrioridade(rs.getInt("PRIORIDADE"));
                ret.add(l);
            }
            conn.close();
        } catch (SQLException e) {
            System.out.println("***SQL EXCEPTION @ getUsuario***");
            e.printStackTrace();
        }
        return ret;
    }
    
    public boolean setLista(Lista lista) {
        //TODONE: tah errado... precisa fazer com que nao tenham entradas repetidas.
        Connection conn;
        PreparedStatement ps;
        CallableStatement cs;
        ResultSet rs;
        if(lista == null) return false;
        try {
            conn = JDBCUtil.getConnection();
            String querycount = "select count(idrevista) as contador from lista where idrevista = " + lista.getIDRevista() + " and idusuario = " + lista.getIDUsuario();
            ps = conn.prepareStatement(querycount);
            rs = ps.executeQuery();
            rs.next();
            if(rs.getInt("CONTADOR") > 0) {
                System.out.println("Entrada duplicada... ERRO");
                return false;
            }
            String query = "insert into lista values ("+lista.getIDRevista()+","+lista.getIDUsuario()+",null,null,"+lista.getPrioridade()+")";
            ps = conn.prepareStatement(query);
            return !ps.execute();
        } catch (SQLException e) {
            System.out.println("***SQL EXCEPTION @ setLista***");
            e.printStackTrace();
        }
        return false;
    }
    
    public boolean updateLista(Lista lista) {
        Connection conn;
        PreparedStatement ps;
        CallableStatement cs;
        ResultSet rs;
        Calendar c = Calendar.getInstance();
        if(lista == null) return false;
        try {
            conn = JDBCUtil.getConnection();
            String querycount = "select count(idrevista) as contador from lista where idrevista = " + lista.getIDRevista() + " and idusuario = " + lista.getIDUsuario();
            ps = conn.prepareStatement(querycount);
            rs = ps.executeQuery();
            rs.next();
            if(rs.getInt("CONTADOR") == 0) {
                System.out.println("Nao esta inscrito na lista... ERRO");
                return false;
            }
            String entrega = "null";
            String recebimento = "null";
            String prioridade = String.valueOf(lista.getPrioridade());
            if(lista.getDt_Entrega() != null) {
                c.setTime(lista.getDt_Entrega());
                entrega = "DATE('" + c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-" + c.get(Calendar.DAY_OF_MONTH) + "')";
            }
            if(lista.getDt_Recebimento() != null) {
                c.setTime(lista.getDt_Recebimento());
                recebimento = "DATE('" + c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-" + c.get(Calendar.DAY_OF_MONTH) + "')";
            }
            String query = "update lista set dt_recebimento = " + recebimento + ", dt_entrega = " + entrega + ", prioridade = " + prioridade + " where idrevista = " + lista.getIDRevista() + " and idusuario = " + lista.getIDUsuario();
            System.out.println("QUERY DO UPDATELISTA:::: " + query);
            ps = conn.prepareStatement(query);
            return !ps.execute();
            //return true;
        } catch (SQLException e) {
            System.out.println("***SQL EXCEPTION @ updateLista***");
            e.printStackTrace();
        }
        return false;
    }
    
}
